在我們關閉程式時,必須要確認裡面的行為都已經處理完且當下沒有新的要求進來,才能關閉app,不然使用者更新到一半或是資料取一半,結果程式被關閉的話,會造成資料破損。
shutdowObserver := make(chan os.Signal, 1)
signal.Notify(shutdowObserver, syscall.SIGINT, syscall.SIGTERM)
select {
case s := <-shutdowObserver:
fmt.Print(s)
return err
}
上面的程式碼,是透過先建立一個os.Signal的channel,然後透過signal.Notify來監控,signal.Notify第一個參數就是剛剛建立好用來監聽的channel,後面則是你要監聽的訊號。
通常會監控這些訊號:
在上面的程式裡面,單純就是接收到訊號後把它印出來,但是其實可以依造訊號去設定switch,來進行不同行為,就像下面這樣:
switch s {
case syscall.SIGQUIT:
fmt.Print("SIGQUIT")
//do something
return
case syscall.SIGSTOP:
fmt.Print("SIGSTOP")
//do something
return
case syscall.SIGHUP:
fmt.Print("SIGHUP")
//do something
return
case syscall.SIGKILL:
fmt.Print("SIGKILL")
//do something
return
case syscall.SIGUSR1:
fmt.Print("SIGUSR1")
//do something
return
default:
fmt.Print("default")
return
}
而在web-server要關閉時,可以先停到web-server,讓他不會再接收新任務,等內部把流程跑完後,在關閉。
不過這邊有個特例,如果程式內部panic掉,他是不會有任何訊號的,所以必須要盡量避免程式panic掉。